#include "led.h"

void ledInit(void) {
    /* 
     * P65-->RCC基地址 0x4002 3800
     *       GPIOB在AHB1 0x4002 0400 - 0x4002 07FF
     * P182-->GPIOB时钟使能位 bit1 偏移量0x30
     */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
    /* 
     * 使用PB1
     * P284-->General purpose output mode 在 GPIOB_MODER 偏移量0x00
     *        Output push-pull 在 GPIOB_OTYPER 偏移量0x04
     * P285-->Low speed 在 GPIOB_OSPEEDR 偏移量0x08
     *        No pull-up, pull-down 在 GPIOB_PUPDR 偏移量0x0C
     * P286-->输出电平在GPIOB_ODR 偏移量0x14
     */
    GPIOB->MODER &= ~(GPIO_MODER_MODE1_Msk); // 清除PB1的模式位
    GPIOB->MODER |= GPIO_MODER_MODE1_0; // 设置 PB1 为输出模式（01）
    GPIOB->OTYPER &= ~(GPIO_OTYPER_OT_1); // 设置 PB1 为推挽输出（0）
    GPIOB->OSPEEDR &=  ~(GPIO_OSPEEDR_OSPEED1_Msk); // 将 PB1 设置为低速模式
    GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEED1_0;
    GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD1_Msk); // 设置 PB1 为无上拉下拉电阻
    GPIOB->ODR |= GPIO_ODR_OD1; // 设置 PB1 为高电平
    // GPIOB->ODR &= ~(GPIO_ODR_OD1); // 设置 PB1 为低电平
}

void togglePin(GPIO_TypeDef* GPIOx, uint16_t Pin) {
    GPIOx->ODR ^= (1<<Pin); // 通过位操作翻转指定引脚的电平
}

// void ledProc(uint32_t currentTick) {
//     static uint32_t oldTick = 0;
//     if(currentTick - oldTick >= 1000) { // 每1s
//         togglePin(GPIOB, 1); // 翻转一次LED引脚
//         oldTick = currentTick;
//     }
// }
